package br.com.rpinfo.helpdesk.filter;

import br.com.rpinfo.helpdesk.util.HibernateUtil;
import java.io.IOException;
import javax.servlet.*;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;

public class ConexaoHibernateFilter implements Filter {

  private SessionFactory sf;

  @Override
  public void init(FilterConfig config) throws ServletException {
    this.sf = HibernateUtil.getSessionFactory();
  }

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
          FilterChain chain) throws ServletException {
    try {
      this.sf.getCurrentSession().beginTransaction();
      chain.doFilter(servletRequest, servletResponse);
      this.sf.getCurrentSession().getTransaction().commit();
      this.sf.getCurrentSession().close();
    } catch (IOException | ServletException | HibernateException ex) {
      try {
        if (this.sf.getCurrentSession().getTransaction().isActive()) {
          this.sf.getCurrentSession().getTransaction().rollback();
        }
      } catch (HibernateException t) {
        t.printStackTrace();
      }
      throw new ServletException(ex);
    }
  }

  @Override
  public void destroy() {
  }
}
